/*
 * Copyright (C) 2022-2024 Huawei Device Co., Ltd.
 * Licensed under the MIT License, (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://opensource.org/licenses/MIT
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import type { IBusConfiguration } from './IBusConfiguration'
import { Feature } from './Feature'
import type { IPublicationErrorHandler } from '../bus/error/IPublicationErrorHandler'
import { Utils } from '../utils/Utils'
import { LogUtil } from '../../../../utils/LogUtil';

export class BusConfiguration implements IBusConfiguration {
  private properties: Map<String, Object> = new Map<String, Object>();
  private publicationErrorHandlers: Array<IPublicationErrorHandler> = new Array<IPublicationErrorHandler>()

  addFeature(feature: Feature): IBusConfiguration {
    LogUtil.debug(`Adding feature: ${Utils.getClassName(feature)}`);
    let className = Utils.getClassName(feature);
    this.properties.set(className, feature);
    return this;
  }

  getFeature(name: String): Feature {
    LogUtil.debug(`Getting feature: ${name}`);
    if (this.properties.has(name)) {
      let value = this.properties.get(name)
      return value;
    }
    return undefined;
  }

  addPublicationErrorHandler(handle: IPublicationErrorHandler) {
    if (handle) {
      LogUtil.debug('Adding publication error handler');
      this.publicationErrorHandlers.push(handle);
    } else {
      LogUtil.error('Attempted to add null publication error handler');
    }
    return this;
  }

  getRegisteredPublicationErrorHandlers(): Array<IPublicationErrorHandler> {
    LogUtil.debug(`Retrieving ${this.publicationErrorHandlers.length} publication error handlers`);
    return this.publicationErrorHandlers;
  }
}